package br.org.acessobrasil.portal.htmlcache;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;

import br.org.acessobrasil.portal.action.ArquivoAction;
import br.org.acessobrasil.portal.modelo.Pagina;

/**
 * Salvar os arquivos como nuPagina.html
 * na pasta do site /cache
 * comparar a data da pagina com a data do arquivo  
 * <br>
 * Tomar cuidado com os conteudos que podem ser despublicados automaticamente
 * <br>
 * Marcar a data em que foi feito o cache e nao deixar passar de 1 dia
 */
public class HtmlCache {
	private static Logger logger = Logger.getLogger(HtmlCache.class);
	
	//private static final long EXPIRES = 24*60*60*1000;
	private static final long EXPIRES = 30*1000;
	
	private static void checkFolders(Pagina pagina){
		File cacheFolder = ArquivoAction.getFile(pagina.getSitio(), "cache/pagina");
		if(!cacheFolder.exists()){
			//tenta criar
			logger.debug("Criando diretorno para cache " + cacheFolder.getAbsolutePath());
			cacheFolder.mkdirs();
		}
	}
	
	public static void writeCache(String html, String nomeHtml,Pagina pagina){
		checkFolders(pagina);
		try {
			//FileUtils.writeStringToFile(ArquivoAction.getFile(pagina.getSitio(), "cache/pagina/"+nomeHtml),html,"iso-8859-1");
		} catch (Exception e) {
			logger.error("Erro inesperado:" + e.getMessage(),e);
		}
	}
	/**
	 * Retorna o html em cache da pagina
	 * @param pagina Pagina a qual se refere o html
	 * @param nomeHtml nome do arquivo .htm
	 * @return null se o cache nao existir ou estiver invalido e html se houver e estiver valido
	 */
	public static String getHtmlCachePagina(Pagina pagina,String nomeHtml){
		try {
			//ver se a pasta de cache existe
			checkFolders(pagina);
			
			File cachePagina = ArquivoAction.getFile(pagina.getSitio(), "cache/pagina/"+nomeHtml);
			if(!cachePagina.exists()){
				logger.debug("inexistente " + cachePagina.getAbsolutePath());
			}
			if(pagina.getDataControleDeCache()!=null){
				if(pagina.getDataControleDeCache().getTime()>cachePagina.lastModified()){
					//a pagina eh mais recente
					logger.debug("A pagina eh mais recente");
					return null;
				}
				if(cachePagina.lastModified()+EXPIRES<System.currentTimeMillis()){
					//o cache ja passou do tempo, ou seja, expirou
					logger.debug("O cache expirou");
					return null;
				}
				//cache valido
				return FileUtils.readFileToString(cachePagina, "iso-8859-1");
			}else{
				logger.debug("Pagina nao possui data de controle para cache");
			}
		} catch (Exception e) {
			logger.error("Erro inesperado:" + e.getMessage(),e);
		}
		//caso de um erro retorna null
		return null;
	}
}
